package com.class05.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Configuration
@PropertySource("classpath:jdbc.properties")
public class MyConfiguration {

    @Value("${class05.driver}")
    private String driver;
    @Value("${class05.url}")
    private String url;
    @Value("${class05.username}")
    private String username;
    @Value("${class05.password}")
    private String password;

    /**
     * 创建数据源
     *
     * @return
     * @Bean 注解表示该方法返回的对象是一个Bean，Spring会自动管理这个Bean，
     * 并将其注册到Spring容器中。会默认提供一个名为方法名的组件id
     * 如果需要自定义组件id，可以是使用@Bean(name="xxx")
     * @Bean中周期方法可以使用init-method和destroy-method来指定初始化和销毁方法 在使用生命周期方法是，需要注意定义该注解地下的方法返回值类型必须是实现类
     * <p>
     * <p>
     * <p>
     * 作用域：和以前的@Scope("prototype")作用域一样 默认是单例模式
     */

//    @Bean(initMethod = "init", destroyMethod = "close")
//    @Scope("prototype")  // 多例模式
    @Bean(name = "ds")
    public DruidDataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }


    @Bean(name = "ds1")
    public DruidDataSource dataSource1() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
//        需要数据源，所以需要ioc容器的其他组件
//        方案1.如果其他也是@Bean注解，直接使用即可 ，会自动注入
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource());
        return jdbcTemplate;

    }
    @Bean
    public JdbcTemplate jdbcTemplate2(DataSource ds1) {
// 方式2.通过参数传递，需要在配置类中添加@Bean注解，
// 并指定方法名称，方法名称就是组件id
//        如果有多个数据源，可以在创建数据源的方法上通过
//        @Bean注解中的name属性指定组件id，引用的方法中形参需要与被引用的组件id名一致
//        return new JdbcTemplate(dataSource);
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(ds1);
        return jdbcTemplate;

    }


    public void init() {
        System.out.println("初始化方法");
    }

    public void close() {
        System.out.println("销毁方法");
    }
}
